package Vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;

import Controleur.CreerPartieReseauxActionListener;
import Controleur.CreerPartieReseauxChangeListener;
import Modele.Configuration;
import Modele.Partie;

public class CreerPartieReseau extends JPanel {

	private Partie partie;
	private final static Image img = new ImageIcon("./src/Images/creerPartie.png").getImage();
	private ActionListener actionListener;
	private ChangeListener changeListener;

	private JPanel haut;

	private JButton boutonLancerPartie = new JButton("Lancer la partie");
	private JButton boutonRetour = new JButton("Quitter");
	private ArrayList<JButton> listeBoutonsPuissance;
	private ArrayList<JLabel> listeChoixPuissance;
	private JSlider nbJoueurs = new JSlider(Configuration.MIN_NBJOUEURS,
			Configuration.MAX_NBJOUEURS, Configuration.DEFAUT_NBJOUEURS);
	private JSpinner dureePartieTps = new JSpinner();
	private JSpinner dureePartieNbAnnees = new JSpinner();
	private JSpinner nbPtsRavitallement = new JSpinner();
	private JSpinner dureeNegociations = new JSpinner();
	private JSpinner dureeOrdres = new JSpinner();
	private JSpinner dureeDispersions = new JSpinner();
	// Add par thomas
	private JTextField jTextFieldChatSend = new javax.swing.JTextField();
	private JButton boutonEnvoyerMsg = new JButton("Envoyer");
	private JTextArea jTextAreaChatReceive = new JTextArea();

	public CreerPartieReseau(Partie partie) {
		this.partie = partie;
		actionListener = new CreerPartieReseauxActionListener(this, partie);
		changeListener = new CreerPartieReseauxChangeListener(this);
		initFenetre();
		initPanelChoixPuissances(Configuration.DEFAUT_NBJOUEURS);
		initPanelParametres();
		initPanelCommande();
		initPanelChat();
		setVisible(true);
	}

	public void initFenetre() {
		setBackground(Color.CYAN);
		Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
		setPreferredSize(size);
		setMinimumSize(size);
		setMaximumSize(size);
		setSize(size);
		setLayout(null);
		haut = new JPanel(new BorderLayout());
		add(haut);
		haut.setBounds(33, 109, 1295, 213);
	}

	public void initPanelChoixPuissances(int nbJoueur) {
		haut.removeAll();
		listeBoutonsPuissance = new ArrayList<JButton>();
		JPanel panelListePuissance = new JPanel(new GridLayout(1, nbJoueur));
		panelListePuissance.setSize(1300, 185);
		haut.add(panelListePuissance, BorderLayout.PAGE_START);
		switch (nbJoueur) {
		case 7:
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_an.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_fr.png")));
			listeBoutonsPuissance.add(new JButton(
					new ImageIcon("./src/Images/icone_soldat_all.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_it.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_ah.png")));
			listeBoutonsPuissance.add(new JButton(new ImageIcon(
					"./src/Images/icone_soldat_russ.png")));
			listeBoutonsPuissance.add(new JButton(
					new ImageIcon("./src/Images/icone_soldat_tur.png")));
			break;
		case 6:
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_an.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_fr.png")));
			listeBoutonsPuissance.add(new JButton(
					new ImageIcon("./src/Images/icone_soldat_all.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_it.png")));
			listeBoutonsPuissance
					.add(new JButton(new ImageIcon("./src/Images/icone_soldat_ah.png")));
			listeBoutonsPuissance.add(new JButton(new ImageIcon(
					"./src/Images/icone_soldat_russ.png")));
			break;
		default:
		}
		for (JButton bouton : listeBoutonsPuissance) {
			bouton.setOpaque(false);
			bouton.setBackground(Color.WHITE);
			panelListePuissance.add(bouton);
			bouton.addActionListener(actionListener);
		}
		JPanel panelChoixPuissance = new JPanel(new GridLayout(1, nbJoueur));
		haut.add(panelChoixPuissance, BorderLayout.PAGE_END);
		listeChoixPuissance = new ArrayList<JLabel>();
		for (int i = 0; i < listeBoutonsPuissance.size(); i++) {
			JLabel puissance = new JLabel("", JLabel.CENTER);
			listeChoixPuissance.add(puissance);
			panelChoixPuissance.add(puissance);
		}
	}

	public void initPanelParametres() {
		JPanel panelParametres = new JPanel();
		panelParametres.setBounds(700, 350, 625, 415);
		add(panelParametres);
		panelParametres.setLayout(new GridLayout(10, 2));
		panelParametres.setOpaque(false);
		// Choix du nombre de joueurs
		JLabel lNbJoueurs = new JLabel("Nombre de joueurs :");
		panelParametres.add(lNbJoueurs);
		nbJoueurs.setOpaque(false);
		nbJoueurs.setMajorTickSpacing(1);
		nbJoueurs.setMinorTickSpacing(1);
		nbJoueurs.setPaintTicks(true);
		nbJoueurs.setPaintLabels(true);
		panelParametres.add(nbJoueurs);
		panelParametres.add(new JLabel(""));
		panelParametres.add(new JLabel(""));
		nbJoueurs.addChangeListener(changeListener);
		// Choix de la durée de la patie en temps
		JLabel lDureePartieTps = new JLabel("Durée de la partie en temps :");
		panelParametres.add(lDureePartieTps);
		dureePartieTps.setPreferredSize(new Dimension(10, 2));
		JSpinner.NumberEditor pDureePartieTps = new JSpinner.NumberEditor(dureePartieTps);
		dureePartieTps.setEditor(pDureePartieTps);
		pDureePartieTps.getModel().setMinimum(Configuration.MIN_DUREE_PARTIE_TPS);
		pDureePartieTps.getModel().setMaximum(Configuration.MAX_DUREE_PARTIE_TPS);
		pDureePartieTps.getModel().setValue(Configuration.DEFAUT_DUREE_PARTIE_TPS);
		pDureePartieTps.getModel().setStepSize(30);
		pDureePartieTps.getFormat().applyPattern("###,##0");
		panelParametres.add(dureePartieTps);
		// Choix de la durée de la partie en nombre d'années
		JLabel lDureePartieNbAnnees = new JLabel("Durée de la partie en nombre d'années :");
		panelParametres.add(lDureePartieNbAnnees);
		JSpinner.NumberEditor pDureePartieNbAnnees = new JSpinner.NumberEditor(dureePartieNbAnnees);
		dureePartieNbAnnees.setEditor(pDureePartieNbAnnees);
		pDureePartieNbAnnees.getModel().setMinimum(Configuration.MIN_DUREE_PARTIE_NBANNEES);
		pDureePartieNbAnnees.getModel().setMaximum(Configuration.MAX_DUREE_PARTIE_NBANNEES);
		pDureePartieNbAnnees.getModel().setValue(Configuration.DEFAUT_DUREE_PARTIE_NBANNEES);
		pDureePartieNbAnnees.getModel().setStepSize(1);
		pDureePartieNbAnnees.getFormat().applyPattern("###,##0");
		panelParametres.add(dureePartieNbAnnees);
		// Choix du nombre de point de ravitallement à controler pour gagner
		JLabel lNbPtsRavitaillement = new JLabel("Nombre de points de ravitaillement à contrôler :");
		panelParametres.add(lNbPtsRavitaillement);
		JSpinner.NumberEditor pNbPtsRav = new JSpinner.NumberEditor(nbPtsRavitallement);
		nbPtsRavitallement.setEditor(pNbPtsRav);
		pNbPtsRav.getModel().setMinimum(Configuration.MIN_CENTRES_RAVITALLEMENT_VICTOIRE);
		pNbPtsRav.getModel().setMaximum(Configuration.MAX_CENTRES_RAVITALLEMENT_VICTOIRE);
		pNbPtsRav.getModel().setValue(Configuration.DEFAUT_CENTRES_RAVITALLEMENT_VICTOIRE);
		pNbPtsRav.getModel().setStepSize(1);
		pNbPtsRav.getFormat().applyPattern("###,##0");
		panelParametres.add(nbPtsRavitallement);
		// Choix de la durée de la phase de négociations
		JLabel lDureeNegociations = new JLabel("Durée de la phase de négociations :");
		panelParametres.add(lDureeNegociations);
		JSpinner.NumberEditor pDureeNegociations = new JSpinner.NumberEditor(dureeNegociations);
		dureeNegociations.setEditor(pDureeNegociations);
		pDureeNegociations.getModel().setMinimum(Configuration.MIN_DUREE_NEGOCIATIONS);
		pDureeNegociations.getModel().setMaximum(Configuration.MAX_DUREE_NEGOCIATIONS);
		pDureeNegociations.getModel().setValue(Configuration.DEFAUT_DUREE_NEGOCIATIONS);
		pDureeNegociations.getModel().setStepSize(1);
		pDureeNegociations.getFormat().applyPattern("###,##0");
		panelParametres.add(dureeNegociations);
		// Choix de la durée de la phase de rédaction des ordres
		JLabel lDureeOrdres = new JLabel("Durée de la phase de rédaction des ordres :");
		panelParametres.add(lDureeOrdres);
		JSpinner.NumberEditor pDureeOrdres = new JSpinner.NumberEditor(dureeOrdres);
		dureeOrdres.setEditor(pDureeOrdres);
		pDureeOrdres.getModel().setMinimum(Configuration.MIN_DUREE_ORDRES);
		pDureeOrdres.getModel().setMaximum(Configuration.MAX_DUREE_ORDRES);
		pDureeOrdres.getModel().setValue(Configuration.DEFAUT_DUREE_ORDRES);
		pDureeOrdres.getModel().setStepSize(1);
		pDureeOrdres.getFormat().applyPattern("###,##0");
		panelParametres.add(dureeOrdres);
		// Choix de la d urée de la phase de dispersions
		JLabel lDureeDispersions = new JLabel("Durée de la phase de dispersions :");
		panelParametres.add(lDureeDispersions);
		JSpinner.NumberEditor pDureeDispersions = new JSpinner.NumberEditor(dureeDispersions);
		dureeDispersions.setEditor(pDureeDispersions);
		pDureeDispersions.getModel().setMinimum(Configuration.MIN_DUREE_DISPERSIONS);
		pDureeDispersions.getModel().setMaximum(Configuration.MAX_DUREE_DISPERSIONS);
		pDureeDispersions.getModel().setValue(Configuration.DEFAUT_DUREE_DISPERSIONS);
		pDureeDispersions.getModel().setStepSize(1);
		pDureeDispersions.getFormat().applyPattern("###,##0");
		panelParametres.add(dureeDispersions);
	}

	public void initPanelChat() {
		JPanel panelChat = new JPanel();
		panelChat.setLayout(null);
		panelChat.setBounds(33, 342, 640, 412);
		panelChat.setOpaque(false);
		add(panelChat);
		// JTextArea jTextArea1 = new JTextArea();
		jTextAreaChatReceive.setColumns(56);
		jTextAreaChatReceive.setRows(21);
		panelChat.add(jTextAreaChatReceive);
		jTextAreaChatReceive.setOpaque(false);
		jTextAreaChatReceive.setBounds(5, 5, 630, 340);
		// affichage Chat
		Thread r = new Thread() {
			public void run() {
				byte[] in = new byte[500];
				DatagramPacket packetIn = null;
				try {
					packetIn = new DatagramPacket(in, in.length,
							InetAddress.getByName(Configuration.ADRESSE_CONNEXION),
							Configuration.PORT_CONNEXION);
				} catch (UnknownHostException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				// Reception d'un packet
				try {
					while (true) {
						Partie.castSocket.receive(packetIn);
						byte[] tabReceive = new byte[packetIn.getLength()];
						System.arraycopy(packetIn.getData(), 0, tabReceive, 0, packetIn.getLength());
						String s = new String(tabReceive);
						System.out.write(packetIn.getData(), 0, packetIn.getLength());
						System.out.println();
						jTextAreaChatReceive.setText(jTextAreaChatReceive.getText() + "\n" + s);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};
		r.start();
		// Fin affichage chat
		// JTextField jTextField1 = new javax.swing.JTextField();
		jTextFieldChatSend.setText("jTextFieldChatSend");
		panelChat.add(jTextFieldChatSend);
		jTextFieldChatSend.setBounds(0, 367, 540, 30);
		jTextFieldChatSend.setOpaque(false);
		panelChat.add(boutonEnvoyerMsg);
		boutonEnvoyerMsg.setBounds(550, 367, 100, 30);
		boutonEnvoyerMsg.addActionListener(actionListener);
	}

	public void initPanelCommande() {
		JPanel panelCommandes = new JPanel();
		panelCommandes.setBounds(694, 709, 635, 40);
		panelCommandes.setOpaque(false);
		add(panelCommandes);
		panelCommandes.setLayout(null);
		panelCommandes.add(boutonLancerPartie);
		boutonLancerPartie.setBounds(510, 0, 125, 30);
		boutonLancerPartie.addActionListener(actionListener);
		panelCommandes.add(boutonRetour);
		boutonRetour.setBounds(0, 0, 125, 30);
		boutonRetour.addActionListener(actionListener);
	}

	public void paintComponent(Graphics g) {
		g.drawImage(img, 0, 0, null);
	}

	public JButton getBoutonLancerPartie() {
		return boutonLancerPartie;
	}

	public JButton getBoutonEnvoyerMsg() {
		return boutonEnvoyerMsg;
	}

	public JButton getBoutonRetour() {
		return boutonRetour;
	}

	public JTextField getTextFieldChatSend() {
		return jTextFieldChatSend;
	}

	public JTextArea getTextAreaChatReceive() {
		return jTextAreaChatReceive;
	}

	public ArrayList<JButton> getListeBoutonsPuissance() {
		return listeBoutonsPuissance;
	}

	public ArrayList<JLabel> getListeChoixPuissance() {
		return listeChoixPuissance;
	}

}
